package ModeloLogicoSistema;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;
import manejoDB.AdministradorDBCliente;

/**
 *
 * @author Veko
 */
public class AdministradorCliente {

    private AdministradorDBCliente consultadorDB;
    private List<Cliente> clientes; //ver que las listas cargadas sean las correctas, validar

    public AdministradorCliente() throws SQLException {
        this.consultadorDB = new AdministradorDBCliente();
        this.clientes = new ArrayList<>();
        this.consultadorDB.Conectar();
    }

    /**
     *
     * @param Integer codigoCliente
     * @return Cliente
     * @see Carga el cliente en la base de datos
     */
    public void persistirCliente(String nombre, String apellido,
            String calle, String nroCalle, String localidad, String cp, String pisoNro,
            String tel, String cel) throws SQLException {

        this.consultadorDB.setNuevoCliente(nombre, apellido, calle, nroCalle, localidad, pisoNro, cp, tel, cel);
    }

    
    /**
     * Obtiene un nuevo número de cliente de una secuencia
     */
    public Integer nuevoCodigoCliente() throws SQLException {
        return this.consultadorDB.getNuevoCodigoCliente();
    }
    
    
    /**
     *
     * Eliminar un cliente, el eliminado es logico
     */
    public void eliminarCliente(Integer codigoCliente) {
        try {
            consultadorDB.eliminarCliente(codigoCliente);
        } catch (SQLException ex) {
        }
    }

    /**
     * Métodos para cargar en memoría RAM
     * Carga desde la base de datos el cliente correspondiente al codigo
     * ingresado
     */
    public Cliente cargarCliente(Integer codigo) {
        Cliente cliente = null;
        try {
            cliente = new Cliente(codigo);
            cliente.setNombre(consultadorDB.getNombreClienteXCod(codigo));
            cliente.setApellido(consultadorDB.getApellidoClienteXCod(codigo));
            cliente.setCalle(consultadorDB.getCalleClienteXCod(codigo));
            cliente.setNroCalle(consultadorDB.getNroCalleClienteXCod(codigo));
            cliente.setLocalidad(consultadorDB.getLocalidadClienteXCod(codigo));
            cliente.setCodigoPostal(consultadorDB.getCPClienteXCod(codigo));
            cliente.setPisoNro(consultadorDB.getPisoNroClienteXCod(codigo));
            cliente.setTelFijo(consultadorDB.getTelClienteXCod(codigo));
            cliente.setCel(consultadorDB.getCelClienteXCod(codigo));
        } catch (Exception ex) {
        }
        return cliente;
    }

    public List<Cliente> cargarListaDeClientes(List<Integer> codigosClientes) {
        List<Cliente> clientesParaMostrar = new ArrayList<>();
        ListIterator it = codigosClientes.listIterator();
        while (it.hasNext()) {
            Cliente cliente = cargarCliente((Integer) it.next());
            clientesParaMostrar.add(cliente);
        }
        return clientesParaMostrar;
    }

    public List<Cliente> cargarTodosLosClientes() throws SQLException {
        return cargarListaDeClientes(this.consultadorDB.getAllCodClientes());
    }

    /**
     * Métodos para buscar datos de clientes
     */
    public List<Cliente> buscarClientePorNombre(String nombre) {
        try {
            return cargarListaDeClientes(consultadorDB.getClienteXNombre(nombre));
        } catch (SQLException ex) {
            return null;
        }
    }

    public List<Cliente> buscarClientePorApellido(String apellido) {
        try {
            return cargarListaDeClientes(consultadorDB.getClienteXApellido(apellido));
        } catch (SQLException ex) {
            return null;
        }
    }

    public List<Cliente> buscarClientePorDomicilio(String localidad,
            String calle, Integer nro) {

        try {
            return cargarListaDeClientes(consultadorDB.getClienteXDomicilio(localidad, calle, nro));
        } catch (SQLException ex) {
            return null;
        }
    }

    public List<Cliente> buscarClientePorTel(String nroTel) {
        try {
            return cargarListaDeClientes(consultadorDB.getClienteXTel(nroTel));
        } catch (SQLException ex) {
            return null;
        }
    }

    public List<Cliente> buscarClientePorCel(String cel) {
        try {
            return cargarListaDeClientes(consultadorDB.getClienteXCel(cel));
        } catch (SQLException ex) {
            return null;
        }
    }


    /**
     *
     * Métodos de modificaciones
     *
     */
    public void updateNombreDelCliente(Integer codigo, String nombre) {
        try {
            consultadorDB.updateNombreCliente(nombre, codigo);
        } catch (SQLException ex) {
        }
    }

    public void updateApellidoDelCliente(Integer nroCliente, String apellido) {
        try {
            consultadorDB.updateApellidoCliente(apellido, nroCliente);
        } catch (SQLException ex) {
            //Logger.getLogger(SistemaPpal.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public void updateCalleDelCliente(Integer nroCliente, String calle) {
        try {
            consultadorDB.updateCalleCliente(calle, nroCliente);
        } catch (SQLException ex) {
        }
    }
    
    public void updateLocalidadDelCliente(Integer nroCliente, String localidad) {
        try {
            consultadorDB.updateLocalidadCliente(localidad, nroCliente);
        } catch (SQLException ex) {
        }
    }
    
    
    public void updateCPDelCliente(Integer nroCliente, String cp) {
        try {
            consultadorDB.updateCPCliente(cp, nroCliente);
        } catch (SQLException ex) {
        }
    }
    
    
    public void updateNroCalleDelCliente(Integer nroCliente, String nrocalle) {
        try {
            consultadorDB.updateNroCalleCliente(nrocalle, nroCliente);
        } catch (SQLException ex) {
        }
    }
    
    public void updatePisoDelCliente(Integer nroCliente, String piso) {
        try {
            consultadorDB.updatePisoCliente(piso, nroCliente);
        } catch (SQLException ex) {
        }
    }

    public void updateTelDelCliente(Integer nroCliente, String tel) {
        try {
            consultadorDB.updateTelCliente(tel, nroCliente);
        } catch (SQLException ex) {
            //Logger.getLogger(SistemaPpal.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public void updateCelDelCliente(Integer nroCliente, String cel) {
        try {
            consultadorDB.updateCelCliente(cel, nroCliente);
        } catch (SQLException ex) {
            //Logger.getLogger(SistemaPpal.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public Cliente buscarClientePorNum(Integer valorBusqueda) throws SQLException {
        if(this.consultadorDB.codigoExistente(valorBusqueda))
            return this.cargarCliente(valorBusqueda);
        else
            return null;
    }
}
